#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NUM 1024    //一个命令的最大长度
#define OPT_NUM 64  //一个命令的最多选项
char lineCommand[NUM];
char* argv[OPT_NUM];
int main() 
{
    while(1) 
    {
        //输出提示符
        printf("[用户名@主机名 当前路径]$ ");
        fflush(stdout);
        //获取用户输入
        char* ret = fgets(lineCommand, sizeof(lineCommand)-1, stdin);  //最后留一个位置来存放极端情况下的\0
        if( ret == NULL ) 
        {
            perror("fgets");
            exit(1);
        }
        lineCommand[strlen(lineCommand) - 1] = '\0';  //消除命令行中最后的换行符
        //将输入解析为多个字符串存放到argv中，即字符串切割
        argv[0] = strtok(lineCommand, " ");
        int i = 1;
        //ls显示颜色
        if(argv[0]!=NULL && strcmp(argv[0],"ls")==0)
        {
            argv[i++]=(char*)"--color=auto";
        }
        while(argv[i++] = strtok(NULL, " "));
        //创建子进程
        pid_t id = fork();
        if(id == -1) 
        {
            perror("fork");
            exit(1);
        } 
        else if (id == 0) 
        {  //子进程
            //进程程序替换
            int ret = execvp(argv[0], argv);
            if(ret == -1) 
            {  
                printf("No such file or directory\n");
                exit(1);
            }
        } 
        else 
        {  //父进程
            //进程等待
            pid_t ret = waitpid(id, NULL, 0);
            if(ret == -1)
            {
                perror("wait");
                exit(1);
            }
        } 
    }
    return 1;  //while循环正常情况下不会结束
}

